home *** CD-ROM | disk | FTP | other *** search
-
- /* Copyright (c) Mark J. Kilgard, 1994, 1997. */
-
- /* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
-
- /* This is an interactive test (not automatically run by "make
- test") that requires user interaction to verify that input
- callbacks operate as expected. */
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <GL/glut.h>
-
- static int mouseButtons;
-
- void
- display(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
- }
-
- void
- time7(int value)
- {
- if (value != 7) {
- printf("FAIL: time7 expected 6\n");
- exit(1);
- }
- printf("PASS: test6\n");
- exit(0);
- }
-
- void
- mstatus(int state)
- {
- printf("state: %d\n", state);
- }
-
- void
- mstatus2(int state, int x, int y)
- {
- printf("state: %d, x=%d, y=%d\n", state, x, y);
- }
-
- void
- menu2(int value)
- {
- printf("menu item selected: %d\n", value);
- if (value != 46) {
- printf("FAIL: time6 expected 45\n");
- exit(1);
- }
- glutDestroyMenu(glutGetMenu());
- glutDestroyWindow(glutGetWindow());
- glutTimerFunc(1000, time7, 7);
- }
-
- void
- time6(int value)
- {
- if (value != 6) {
- printf("FAIL: time6 expected 6\n");
- exit(1);
- }
- glutMenuStateFunc(mstatus);
- glutMenuStatusFunc(mstatus2);
- glutCreateMenu(menu2);
- glutAddMenuEntry("name", 46);
- glutAttachMenu(GLUT_LEFT_BUTTON);
- glutAttachMenu(GLUT_MIDDLE_BUTTON);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- printf("Pop up menu with any mouse button and select the item\n");
- }
-
- int estate = 0;
-
- void
- entry(int state)
- {
- printf("entry: %s\n", state == GLUT_LEFT ? "left" : "entered");
- switch (estate) {
- case 0:
- if (state == GLUT_LEFT)
- estate++;
- break;
- case 1:
- if (state == GLUT_ENTERED)
- estate++;
- glutTimerFunc(1000, time6, 6);
- glutEntryFunc(NULL);
- break;
- }
- }
-
- void
- time5(int value)
- {
- if (value != 5) {
- printf("FAIL: time5 expected 5\n");
- exit(1);
- }
- glutEntryFunc(entry);
- printf("In the black window, leave it, then enter it\n");
- }
-
- void
- motion(int x, int y)
- {
- printf("motion x=%d, y=%d\n", x, y);
- glutMotionFunc(NULL);
- glutTimerFunc(1000, time5, 5);
- }
-
- void
- time4(int value)
- {
- if (value != 4) {
- printf("FAIL: time4 expected 4\n");
- exit(1);
- }
- glutMotionFunc(motion);
- printf("In the black window, move mouse with some button held down\n");
- }
-
- void
- passive(int x, int y)
- {
- printf("passive x=%d, y=%d\n", x, y);
- glutTimerFunc(1000, time4, 4);
- glutPassiveMotionFunc(NULL);
- }
-
- void
- time3(int value)
- {
- if (value != 3) {
- printf("FAIL: time3 expected 3\n");
- exit(1);
- }
- glutPassiveMotionFunc(passive);
- printf("In the black window, mouse the mouse around with NO buttons down\n");
- }
-
- static int mode = 0;
-
- void
- mouse(int button, int state, int x, int y)
- {
- printf("but=%d, state=%d, x=%d, y=%d, modifiers=0x%x\n",
- button, state, x, y, glutGetModifiers());
- switch (mode) {
- case 0:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse left down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 1:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse left up not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- switch (mouseButtons) {
- case 1:
- mode = 6; /* Skip right or middle button tests. */
- printf("In the black window, please click: Shift-left, Ctrl-left, then Alt-left (in that order)\n");
- break;
- case 2:
- mode = 4; /* Continue with right button test
- (skip middle button). */
- break;
- case 3:
- mode = 2; /* Continue with middle button test. */
- break;
- }
- break;
- case 2:
- if (button != GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse center down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 3:
- if (button != GLUT_MIDDLE_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse center up not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 4:
- if (button != GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 5:
- if (button != GLUT_RIGHT_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse right up not found\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: mouse expected no modifier\n");
- exit(1);
- }
- printf("In the black window, please click: Shift-left, Ctrl-left, then Alt-left (in that order)\n");
- mode++;
- break;
- case 6:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
- printf("FAIL: mouse expected shift modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 7:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
- printf("FAIL: mouse expected shift modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 8:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
- printf("FAIL: mouse expected ctrl modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 9:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
- printf("FAIL: mouse expected ctrl modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 10:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
- printf("FAIL: mouse expected alt modifier\n");
- exit(1);
- }
- mode++;
- break;
- case 11:
- if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
- printf("FAIL: mouse right down not found\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
- printf("FAIL: mouse expected alt modifier\n");
- exit(1);
- }
- glutTimerFunc(1000, time3, 3);
- glutMouseFunc(NULL);
- mode++;
- break;
- default:
- printf("FAIL: mouse called with bad mode: %d\n", mode);
- exit(1);
- }
- }
-
- /* ARGSUSED */
- void
- menu(int selection)
- {
- printf("FAIL: menu callback should never be called\n");
- exit(1);
- }
-
- void
- time2(int value)
- {
- if (value != 2) {
- printf("FAIL: time2 expected 2\n");
- exit(1);
- }
- glutMouseFunc(mouse);
-
- /* By attaching and detaching a menu to each button, make
- sure button usage for menus does not mess up normal button
-
- callback. */
- glutCreateMenu(menu);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- glutAttachMenu(GLUT_MIDDLE_BUTTON);
- glutAttachMenu(GLUT_LEFT_BUTTON);
- glutDetachMenu(GLUT_RIGHT_BUTTON);
- glutDetachMenu(GLUT_MIDDLE_BUTTON);
- glutDetachMenu(GLUT_LEFT_BUTTON);
- glutDestroyMenu(glutGetMenu());
-
- switch (mouseButtons) {
- case 3:
- printf("In the black window, please click: left, then middle, then right buttons (in that order)\n");
- break;
- case 2:
- printf("In the black window, please click: left, then right buttons (in that order)\n");
- break;
- case 1:
- printf("In the black window, please click: left button\n");
- break;
- case 0:
- /* No mouse buttons?? Skip all subsequent tests since they
- involve the mouse. */
- glutTimerFunc(1000, time7, 7);
- glutMouseFunc(NULL);
- break;
- }
- }
-
- int smode = 0;
-
- /* XXX Warning, sometimes an X window manager will intercept
- some keystroke like Alt-F2. Be careful about window manager
- interference when running test6. */
-
- void
- special(int key, int x, int y)
- {
- printf("key=%d, x=%d, y=%d, modifiers=0x%x\n",
- key, x, y, glutGetModifiers());
- switch (smode) {
- case 0:
- if (key != GLUT_KEY_F2) {
- printf("FAIL: special expected F2\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: special expected no modifier\n");
- exit(1);
- }
- break;
- case 1:
- if (key != GLUT_KEY_F2) {
- printf("FAIL: special expected F2\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
- printf("FAIL: special expected shift modifier\n");
- exit(1);
- }
- break;
- case 2:
- if (key != GLUT_KEY_F2) {
- printf("FAIL: special expected F2\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
- printf("FAIL: special expected ctrl modifier\n");
- exit(1);
- }
- break;
- case 3:
- if (key != GLUT_KEY_F2) {
- printf("FAIL: special expected F2\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
- printf("FAIL: special expected alt modifier\n");
- exit(1);
- }
- glutSpecialFunc(NULL);
- glutTimerFunc(1000, time2, 2);
- break;
- default:
- printf("FAIL: special called with bad mode: %d\n", smode);
- exit(1);
- }
- smode++;
- }
-
- void
- time1(int value)
- {
- printf("PLEASE EXPECT TO SEE A WARNING ON THE NEXT LINE:\n");
- glutGetModifiers();
- printf("DID YOU SEE A WARNING? IT IS AN ERROR NOT TO SEE ONE.\n");
- if (value != 1) {
- printf("FAIL: time1 expected 1\n");
- exit(1);
- }
- glutSpecialFunc(special);
- printf("In the black window, please press: F2, Shift-F2, Ctrl-F2, then Alt-F2\n");
- }
- int kmode = 0;
-
- void
- keyboard(unsigned char c, int x, int y)
- {
- printf("char=%d, x=%d, y=%d, modifiers=0x%x\n",
- c, x, y, glutGetModifiers());
- switch (kmode) {
- case 0:
- if (c != 'g') {
- printf("FAIL: keyboard expected g\n");
- exit(1);
- }
- if (glutGetModifiers() != 0) {
- printf("FAIL: keyboard expected no modifier\n");
- exit(1);
- }
- break;
- case 1:
- if (c != 'G') {
- printf("FAIL: keyboard expected G\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
- printf("FAIL: keyboard expected shift modifier\n");
- exit(1);
- }
- break;
- case 2:
- if (c != 0x7) { /* Bell, Ctrl-g */
- printf("FAIL: keyboard expected g\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
- printf("FAIL: keyboard expected ctrl modifier\n");
- exit(1);
- }
- break;
- case 3:
- if (c != 'g') {
- printf("FAIL: keyboard expected g\n");
- exit(1);
- }
- if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
- printf("FAIL: keyboard expected alt modifier\n");
- exit(1);
- }
- glutKeyboardFunc(NULL);
- glutTimerFunc(1000, time1, 1);
- break;
- default:
- printf("FAIL: keyboard called with bad mode: %d\n", kmode);
- exit(1);
- }
- kmode++;
- }
-
- void
- time0(int value)
- {
- if (value != 0) {
- printf("FAIL: time0 expected 0\n");
- exit(1);
- }
- glutKeyboardFunc(keyboard);
- printf("In the black window, please press: g, G, Ctrl-g, then Alt-g\n");
- }
-
- int
- main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- mouseButtons = glutDeviceGet(GLUT_NUM_MOUSE_BUTTONS);
- if (mouseButtons < 0) {
- printf("FAIL: negative mouse buttons? mouseButtons=%d\n",
- mouseButtons);
- exit(1);
- }
- if (mouseButtons > 3) {
- printf("More than 3 mouse buttons (ok). mouseButtons=%d\n",
- mouseButtons);
- mouseButtons = 3; /* Testing only of 3 mouse buttons. */
- }
- mouseButtons = 0;
- glutCreateWindow("test");
- glutDisplayFunc(display);
- glutTimerFunc(1000, time0, 0);
- glutMainLoop();
- return 0; /* ANSI C requires main to return int. */
- }
-